package visual.texto;

import java.io.IOException;

import negocios.CaixaPostal;
import negocios.FacadeNegocios;
import negocios.Mensagem;
import negocios.Usuario;
import negocios.excecoes.EntradaInvalidaException;
import negocios.excecoes.NaoEncontradoException;

/**
 * Classe que implementa um Menu com o usuario, para manipulacao da caixa de
 * entrada. Esse menu devera oferecer opcoes como, visualizar mensagens, enviar
 * mensagens, excluir mensagens, etc.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class MenuCaixaPostal extends MenuTexto {
	private static final int AVANCAR = 1;
	private static final int RECUAR = 2;
	private static final int VER = 3;
	private static final int MARCAR_EXC = 4;
	private static final int MARCAR_LIDA = 5;
	private static final int EMAIL = 6;
	private static final int SMS = 7;
	private static final int CONVITE = 8;
	private static final int VOLTAR = 9;

	private static final String POSTAL = "1 - Selecionar Proxima Mensagem"
			+ SEP + "2 - Selecionar Mensagem Anterior" + SEP
			+ "3 - Ver Mensagem " + SEP + "4 - Marcar/Desmarcar como Excluida"
			+ SEP + "5 - Marcar/Desmarcar como Lida" + SEP + "6 - Enviar Email"
			+ SEP + "7 - Enviar SMS" + SEP + "8 - Enviar Convite" + SEP
			+ "9 - Voltar" + SEP;

	private String login;

	/**
	 * Constroi um menu de caixa postal, a partir de um usuario
	 * 
	 * @param login
	 *            o login do usuario
	 */
	public MenuCaixaPostal(String login) {
		this.login = login;
	}

	public void executa() {
		Usuario usuario;
		try {
			usuario = FacadeNegocios.getInstance().buscaPorLogin(login);
		} catch (NaoEncontradoException e1) {
			System.err.println(e1.getMessage());
			return;
		}
		CaixaPostal caixaPostal = usuario.getCaixaPostal();

		System.out.println("########## Caixa Postal ##########");
		System.out.println(POSTAL);

		boolean controlador = true;

		while (controlador) {
			System.out.println("Suas mensagens: " + SEP
					+ caixaPostal.toString() + SEP + "Escolha: ");

			int escolha = getEntradaValida(AVANCAR, VOLTAR);
			if (escolha == INVALIDA) {
				continue;
			}

			switch (escolha) {
			case AVANCAR:
				caixaPostal.avancar();
				break;

			case RECUAR:
				caixaPostal.recuar();
				break;

			case VER:
				if (caixaPostal.numeroDeMensagens() > 0) {
					Mensagem msg = caixaPostal.mensagemAtual();
					System.out.println("######## Mensagem ########");
					System.out.println(msg.toString());
					msg.lida();
					System.out
							.println("-- Aperte Enter para voltar a Caixa Postal --");
					entrada.leLinha();
				}
				break;

			case MARCAR_EXC:
				if (caixaPostal.numeroDeMensagens() > 0) {
					caixaPostal.excluir();
				}
				break;

			case MARCAR_LIDA:
				if (caixaPostal.numeroDeMensagens() > 0) {
					if (caixaPostal.mensagemAtual().isLida()) {
						caixaPostal.mensagemAtual().marcarNaoLida();
					} else {
						caixaPostal.mensagemAtual().lida();
					}
				}
				break;

			case EMAIL:
				System.out.println("###### Email ######");
				System.out.println("Para (login) : ");
				String destinatario = entrada.leLinha();
				System.out.println("Assunto : ");
				String assunto = entrada.leLinha();
				System.out.println("Mensagem : ");
				String conteudo = entrada.leLinha();
				try {
					FacadeNegocios.getInstance()
							.enviarEmail(usuario.getLogin(), destinatario,
									assunto, conteudo);
				} catch (NaoEncontradoException e) {
					System.err.println(e.getMessage());
				} catch (IOException e) {
					System.err.println(e.getMessage());
				}
				break;

			case SMS:
				System.out.println("###### SMS ######");
				System.out.print("Para (login) : ");
				String destino = entrada.leLinha();
				System.out.println("Mensagem : ");
				String msg = entrada.leLinha();
				try {
					FacadeNegocios.getInstance().enviarSMS(usuario.getLogin(),
							destino, msg);
				} catch (NaoEncontradoException e) {
					System.err.println(e.getMessage());
				} catch (EntradaInvalidaException e) {
					System.err.println(e.getMessage());
				} catch (IOException e) {
					System.err.println(e.getMessage());
				}
				break;

			case CONVITE:
				System.out.println("###### Novo Convite ######");
				System.out.println("Para (email) : ");
				String emailDestinatario = entrada.leLinha();
				try {
					FacadeNegocios.getInstance().enviarConvite(
							usuario.getLogin(), emailDestinatario);
				} catch (NaoEncontradoException e) {
					System.err.println(e.getMessage());
				} catch (IOException e) {
					System.err.println(e.getMessage());
				}
				break;

			case VOLTAR:
				caixaPostal.esvaziaLixeira();
				controlador = false;
				System.out.println("Caixa postal fechada." + SEP);
				break;
			}
		}
	}
}